{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "import random\n",
    "\n",
    "import gym\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "from torch.distributions import Categorical"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import clear_output\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Use CUDA</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "use_cuda = torch.cuda.is_available()\n",
    "device   = torch.device(\"cuda\" if use_cuda else \"cpu\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Replay Buffer</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import deque\n",
    "\n",
    "class ReplayBuffer(object):\n",
    "    def __init__(self, capacity):\n",
    "        self.buffer = deque(maxlen=capacity)\n",
    "    \n",
    "    def push(self, state, action, reward, next_state, done, goal):\n",
    "        self.buffer.append((state, action, reward, next_state, done, goal))\n",
    "    \n",
    "    def sample(self, batch_size):\n",
    "        state, action, reward, next_state, done, goal = zip(*random.sample(self.buffer, batch_size))\n",
    "        return np.stack(state), action, reward, np.stack(next_state), done, np.stack(goal)\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.buffer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Bit Flipping Environment</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Env(object):\n",
    "    def __init__(self, num_bits):\n",
    "        self.num_bits = num_bits\n",
    "    \n",
    "    def reset(self):\n",
    "        self.done      = False\n",
    "        self.num_steps = 0\n",
    "        self.state     = np.random.randint(2, size=self.num_bits)\n",
    "        self.target    = np.random.randint(2, size=self.num_bits)\n",
    "        return self.state, self.target\n",
    "    \n",
    "    def step(self, action):\n",
    "        if self.done:\n",
    "            raise RESET\n",
    "        \n",
    "        self.state[action] = 1 - self.state[action]\n",
    "        \n",
    "        if self.num_steps > self.num_bits + 1:\n",
    "            self.done = True\n",
    "        self.num_steps += 1\n",
    "        \n",
    "        if np.sum(self.state == self.target) == self.num_bits:\n",
    "            self.done = True\n",
    "            return np.copy(self.state), 0, self.done, {}\n",
    "        else:\n",
    "            return np.copy(self.state), -1, self.done, {}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Neural Network</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model(nn.Module):\n",
    "    def __init__(self, num_inputs, num_outputs, hidden_size=256):\n",
    "        super(Model, self).__init__()\n",
    "        \n",
    "        self.linear1 = nn.Linear(num_inputs,  hidden_size)\n",
    "        self.linear2 = nn.Linear(hidden_size, num_outputs)\n",
    "    \n",
    "    def forward(self, state, goal):\n",
    "        x = torch.cat([state, goal], 1)\n",
    "        x = F.relu(self.linear1(x))\n",
    "        x = self.linear2(x)\n",
    "        return x\n",
    "    \n",
    "def update_target(current_model, target_model):\n",
    "    target_model.load_state_dict(current_model.state_dict())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_action(model, state, goal, epsilon=0.1):\n",
    "    if random.random() < 0.1:\n",
    "        return random.randrange(env.num_bits)\n",
    "    \n",
    "    state = torch.FloatTensor(state).unsqueeze(0).to(device)\n",
    "    goal  = torch.FloatTensor(goal).unsqueeze(0).to(device)\n",
    "    q_value = model(state, goal)\n",
    "    return q_value.max(1)[1].item()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot(frame_idx, rewards, losses):\n",
    "    clear_output(True)\n",
    "    plt.figure(figsize=(20,5))\n",
    "    plt.subplot(131)\n",
    "    plt.title('Mean Reward: %s. frame: %s' % (rewards[-1], frame_idx))\n",
    "    plt.plot(rewards)\n",
    "    plt.subplot(132)\n",
    "    plt.title('loss')\n",
    "    plt.plot(losses)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Q-learning TD Error</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_td_error(batch_size):\n",
    "    if batch_size > len(replay_buffer):\n",
    "        return None\n",
    "\n",
    "    state, action, reward, next_state, done, goal = replay_buffer.sample(batch_size)\n",
    "\n",
    "    state      = torch.FloatTensor(state).to(device)\n",
    "    reward     = torch.FloatTensor(reward).unsqueeze(1).to(device)\n",
    "    action     = torch.LongTensor(action).unsqueeze(1).to(device)\n",
    "    next_state = torch.FloatTensor(next_state).to(device)\n",
    "    goal       = torch.FloatTensor(goal).to(device)\n",
    "    mask       = torch.FloatTensor(1 - np.float32(done)).unsqueeze(1).to(device)\n",
    "\n",
    "    q_values = model(state, goal)\n",
    "    q_value  = q_values.gather(1, action)\n",
    "\n",
    "    next_q_values = target_model(next_state, goal)\n",
    "    target_action = next_q_values.max(1)[1].unsqueeze(1)\n",
    "    next_q_value  = target_model(next_state, goal).gather(1, target_action)\n",
    "\n",
    "    expected_q_value = reward + 0.99 * next_q_value * mask\n",
    "\n",
    "    loss = (q_value - expected_q_value.detach()).pow(2).mean()\n",
    "\n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "    \n",
    "    return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>DQN without Hindsight Experience Replay</h1>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_bits = 11\n",
    "env = Env(num_bits)\n",
    "\n",
    "model        = Model(2 * num_bits, num_bits).to(device)\n",
    "target_model = Model(2 * num_bits, num_bits).to(device)\n",
    "update_target(model, target_model)\n",
    "\n",
    "#hyperparams:\n",
    "batch_size = 5\n",
    "new_goals  = 5\n",
    "max_frames = 200000\n",
    "    \n",
    "optimizer = optim.Adam(model.parameters())\n",
    "replay_buffer = ReplayBuffer(10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "frame_idx = 0\n",
    "all_rewards = []\n",
    "losses = []\n",
    "\n",
    "while frame_idx < max_frames:\n",
    "    state, goal = env.reset()\n",
    "    done = False\n",
    "    episode = []\n",
    "    total_reward = 0\n",
    "    while not done:\n",
    "        action = get_action(model, state, goal)\n",
    "        next_state, reward, done, _ = env.step(action)\n",
    "        replay_buffer.push(state, action, reward, next_state, done, goal)\n",
    "        state = next_state\n",
    "        total_reward += reward\n",
    "        frame_idx += 1\n",
    "        \n",
    "        if frame_idx % 1000 == 0:\n",
    "            plot(frame_idx, [np.mean(all_rewards[i:i+100]) for i in range(0, len(all_rewards), 100)], losses)\n",
    "        \n",
    "    all_rewards.append(total_reward)\n",
    "    \n",
    "    loss = compute_td_error(batch_size)\n",
    "    if loss is not None: losses.append(loss.data[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1> Hindsight Experience Replay <a href=\"https://arxiv.org/abs/1707.01495\">[arxiv]</a></h1>\n",
    "<h2><a href=\"https://blog.openai.com/ingredients-for-robotics-research/#understandingher\">OpenAI Blog:</a> Understanding HER</h2>\n",
    "<p>To understand what HER does, let’s look at in the context of FetchSlide, a task where we need to learn to slide a puck across the table and hit a target. Our first attempt very likely will not be a successful one. Unless we get very lucky, the next few attempts will also likely not succeed. Typical reinforcement learning algorithms would not learn anything from this experience since they just obtain a constant reward (in this case: -1) that does not contain any learning signal.</p>\n",
    "\n",
    "<p>The key insight that HER formalizes is what humans do intuitively: Even though we have not succeeded at a specific goal, we have at least achieved a different one. So why not just pretend that we wanted to achieve this goal to begin with, instead of the one that we set out to achieve originally? By doing this substitution, the reinforcement learning algorithm can obtain a learning signal since it has achieved some goal; even if it wasn’t the one that we meant to achieve originally. If we repeat this process, we will eventually learn how to achieve arbitrary goals, including the goals that we really want to achieve.</p>\n",
    "\n",
    "<p>This approach lets us learn how to slide a puck across the table even though our reward is fully sparse and even though we may have never actually hit the desired goal early on. We call this technique Hindsight Experience Replay since it replays experience (a technique often used in off-policy RL algorithms like DQN and DDPG) with goals which are chosen in hindsight, after the episode has finished. HER can therefore be combined with any off-policy RL algorithm (for example, HER can be combined with DDPG, which we write as “DDPG + HER”).</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_bits = 11\n",
    "env = Env(num_bits)\n",
    "\n",
    "model        = Model(2 * num_bits, num_bits).to(device)\n",
    "target_model = Model(2 * num_bits, num_bits).to(device)\n",
    "update_target(model, target_model)\n",
    "\n",
    "#hyperparams:\n",
    "batch_size = 5\n",
    "new_goals  = 5\n",
    "max_frames = 200000\n",
    "    \n",
    "optimizer = optim.Adam(model.parameters())\n",
    "replay_buffer = ReplayBuffer(10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "frame_idx = 0\n",
    "all_rewards = []\n",
    "losses = []\n",
    "\n",
    "while frame_idx < max_frames:\n",
    "    state, goal = env.reset()\n",
    "    done = False\n",
    "    episode = []\n",
    "    total_reward = 0\n",
    "    while not done:\n",
    "        action = get_action(model, state, goal)\n",
    "        next_state, reward, done, _ = env.step(action)\n",
    "        episode.append((state, reward, done, next_state, goal))\n",
    "        replay_buffer.push(state, action, reward, next_state, done, goal)\n",
    "        state = next_state\n",
    "        total_reward += reward\n",
    "        frame_idx += 1\n",
    "        \n",
    "        if frame_idx % 10000 == 0:\n",
    "            plot(frame_idx, [np.mean(all_rewards[i:i+100]) for i in range(0, len(all_rewards), 100)], losses)\n",
    "        \n",
    "    all_rewards.append(total_reward)\n",
    "    \n",
    "    \n",
    "    new_episode = []\n",
    "    for state, reward, done, next_state, goal in episode:\n",
    "        for t in np.random.choice(num_bits, new_goals):\n",
    "            try:\n",
    "                episode[t]\n",
    "            except:\n",
    "                continue\n",
    "            new_goal = episode[t][-2]\n",
    "            if np.sum(next_state == new_goal) == num_bits:\n",
    "                reward = 0\n",
    "            else:\n",
    "                reward = -1\n",
    "            replay_buffer.push(state, action, reward, next_state, done, new_goal)\n",
    "            new_episode.append((state, reward, done, next_state, new_goal))\n",
    "    \n",
    "    \n",
    "    \n",
    "    loss = compute_td_error(batch_size)\n",
    "    if loss is not None: losses.append(loss.data[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:pytorch4]",
   "language": "python",
   "name": "conda-env-pytorch4-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
